﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Transactions;

namespace senac.camara.formularioVaga
{
    public partial class CadastroDaVaga : System.Web.UI.Page
    {
        CadastroDaVagaModelo cadVaga = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            cadVaga = new CadastroDaVagaModelo();

            if (!Page.IsPostBack)
            {
                //Ocultando divs que relacionam o controle a um erro
                DesabilitarDivsErros();

                //if (Session["razaoSocial"] != null && Session["nomeFantasia"] != null)
                //{
                //    if (!string.IsNullOrEmpty(Session["razaoSocial"].ToString()) && !string.IsNullOrEmpty(Session["nomeFantasia"].ToString()))
                //    {
                //        this.txtRazaoSocial.Text = Session["razaoSocial"].ToString();
                //        this.txtNomeFantasia.Text = Session["nomeFantasia"].ToString();
                //    }
                //    else
                //        Response.Redirect("Default.aspx");
                //}
                //else
                //    Response.Redirect("Default.aspx");

                #region Carregando todas as informações na tela para ser exposta ao usuário(DropDownList, CheckBoxList)
                
                this.cblBeneficio.DataSource = Dao.Instance.CarregarBeneficio();
                this.cblBeneficio.DataTextField = "descricao";
                this.cblBeneficio.DataValueField = "pkIdBeneficio";
                this.cblBeneficio.DataBind();

                #region Preenchendo horários
                for (int i = 0; i < 24; i++)
                {
                    this.ddlHorarioHoras1.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioHoras2.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioHoras3.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioHoras4.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                }

                for (int i = 0; i < 60; i++)
                {
                    this.ddlHorarioMinutos1.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioMinutos2.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioMinutos3.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                    this.ddlHorarioMinutos4.Items.Add((i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()));
                }
                #endregion

                //Tabela que não está no padrão das demais do camará. Ela foi aproveitada da Base Intranet.
                DataTable dtUf = Dao.Instance.CarregarUf();

                //Carregando tabela de UFs
                this.ddlUf.DataSource = dtUf;
                this.ddlUf.DataTextField = "UFSigla";
                this.ddlUf.DataValueField = "CodUF";
                this.ddlUf.DataBind();

                #endregion
            }
        }

        /// <summary>
        /// Método genérico para carregar todos os dropdownlists. Necessário que a tabela no banco tenha a estrutura com duas colunas, uma para id e outra para descrição.
        /// </summary>
        /// <param name="ddl">DropDownList que será usado para receber o valor retornado do banco</param>
        /// <param name="tabela">Nome da tabela no banco de dados para efetuar a consulta</param>
        private void CarregarDropDownList(DropDownList ddl, DataTable tabela)
        {
            ddl.DataSource = tabela;
            ddl.DataTextField = "descricao";
            ddl.DataValueField = "pkId";
            ddl.DataBind();
        }

        protected void Cadastrar_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                try
                {
                    DesabilitarDivsErros();

                    #region Empregador e Informações Financeiras
                    bool passouEmpregInfoFinanc = false;

                    decimal salar = 0;
                    List<int> listBeneficios = new List<int>();

                    if (string.IsNullOrEmpty(this.txtSalarioOferecido.Text) || !Decimal.TryParse(this.txtSalarioOferecido.Text, out salar))
                    {
                        this.divErroSalarioOferecido.Visible = true;
                        Mensagem("Preencher corretamente o campo Salário.");
                    }
                    else
                    {
                        //Validando o CheckBoxList BENEFÍCIOS
                        foreach (ListItem beneficio in this.cblBeneficio.Items)
                        {
                            if (beneficio.Selected)
                                listBeneficios.Add(Convert.ToInt32(beneficio.Value));
                        }

                        if (listBeneficios.Count == 0)
                        {
                            this.divErroBeneficios.Visible = true;
                            Mensagem("Selecione alguma opção de Benefícios.");
                        }
                        else
                            passouEmpregInfoFinanc = true;
                    }
                    #endregion

                    #region HorárioDeTrabalho
                    bool passouHorarioDeTrabalho = false;

                    int cargaHorariaSemanal = 0;

                    if (passouEmpregInfoFinanc)
                    {
                        if (string.IsNullOrEmpty(this.ddlHorarioHoras1.SelectedValue) || string.IsNullOrEmpty(this.ddlHorarioMinutos1.SelectedValue) ||
                            string.IsNullOrEmpty(this.ddlHorarioHoras2.SelectedValue) || string.IsNullOrEmpty(this.ddlHorarioMinutos2.SelectedValue))
                        {
                            this.divErroPrimeiroExpediente.Visible = true;
                            Mensagem("Selecionar horário do 1º Expediente.");
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(this.ddlHorarioHoras3.SelectedValue) || string.IsNullOrEmpty(this.ddlHorarioMinutos3.SelectedValue) ||
                            string.IsNullOrEmpty(this.ddlHorarioHoras4.SelectedValue) || string.IsNullOrEmpty(this.ddlHorarioMinutos4.SelectedValue))
                            {
                                this.divErroSegundoExpediente.Visible = true;
                                Mensagem("Selecionar horário do 2º Expediente.");
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(this.txtCargaHorariaSemanal.Text) || !int.TryParse(this.txtCargaHorariaSemanal.Text, out cargaHorariaSemanal))
                                {
                                    this.divErroCargaHorariaSemanal.Visible = true;
                                    Mensagem("Preencher corretamente o campo Carga Horária Semanal.");
                                }
                                else
                                {
                                    passouHorarioDeTrabalho = true;
                                }
                            }
                        }
                    }
                    #endregion

                    #region Entrevista

                    bool passouEntrevista = false;

                    int numero = 0;

                    if (passouHorarioDeTrabalho)
                    {
                        if (string.IsNullOrEmpty(this.txtNumero.Text) || !int.TryParse(this.txtNumero.Text, out numero))
                        {
                            this.divErroNumero.Visible = true;
                            Mensagem("Preencher corretamente o campo Número.");
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(this.txtCep.Text) || this.txtCep.Text.Length != 10)
                            {
                                this.divErroCep.Visible = true;
                                Mensagem("Preencher corretamente o campo Cep. Ex: xx.xxx-xxx");
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(this.txtTelefone.Text) || this.txtTelefone.Text.Length != 14)
                                {
                                    this.divErroTelefone.Visible = true;
                                    Mensagem("Preencher corretamente o campo Telefone. Ex: (xx) xxxx-xxxx");
                                }
                                else
                                    passouEntrevista = true;
                            }
                        }
                    }
                    #endregion

                    if (passouEmpregInfoFinanc && passouHorarioDeTrabalho && passouEntrevista)
                    {
                        //Empregador e Informações Financeiras
                        cadVaga.RazaoSocial = this.txtRazaoSocial.Text;
                        cadVaga.NomeFantasia = this.txtNomeFantasia.Text;
                        cadVaga.Ocupacao = this.txtOcupacao.Text;
                        cadVaga.Funcao = this.txtFuncao.Text;
                        cadVaga.SalarioOferecido = salar;
                        cadVaga.ListBeneficios = listBeneficios;

                        //Horário de Trabalho
                        cadVaga.PrimExpedienteEntrada = this.ddlHorarioHoras1.SelectedValue + ":" + this.ddlHorarioMinutos1.SelectedValue;
                        cadVaga.PrimExpedienteSaida = this.ddlHorarioHoras2.SelectedValue + ":" + this.ddlHorarioMinutos2.SelectedValue;
                        cadVaga.SegExpedienteEntrada = this.ddlHorarioHoras3.SelectedValue + ":" + this.ddlHorarioMinutos3.SelectedValue;
                        cadVaga.SegmExpedienteSaida = this.ddlHorarioHoras4.SelectedValue + ":" + this.ddlHorarioMinutos4.SelectedValue;
                        cadVaga.CargaHorariaSemanal = cargaHorariaSemanal;

                        //Entrevista
                        cadVaga.ContatoEntrevista = this.txtContato.Text;
                        cadVaga.Endereco = this.txtEndereco.Text;
                        cadVaga.Numero = numero;
                        cadVaga.Complemento = this.txtComplemento.Text;
                        cadVaga.BairroDistrito = this.txtBairroDistrito.Text;

                        string[] cep = this.txtCep.Text.Split(new char[] { '.', '-' });
                        for (int i = 0; i < cep.Length; i++)
                            cadVaga.Cep += cep[i].ToString();

                        cadVaga.Municipio = this.txtMunicipio.Text;
                        cadVaga.Uf = this.ddlUf.SelectedItem.Text;
                        cadVaga.ReferenciaAcesso = this.txtReferenciaAcesso.Text;

                        string[] telef = this.txtTelefone.Text.Split(new char[] { '(', ')', ' ', '-' });
                        for (int i = 0; i < telef.Length; i++)
                            cadVaga.Telefone += telef[i].ToString();

                        cadVaga.Email = this.txtEmail.Text;
                        cadVaga.Observacao = this.txtObservacoes.Text;

                        //Comando sql para insert nas tabelas
                        bool retorno = Dao.Instance.CadastrarVaga(cadVaga);

                        if (retorno)
                        {
                            limparControles(this);
                            Mensagem("Vaga Cadastrada com sucesso!");
                        }
                        else
                            Mensagem("Erro ao Cadastrar Vaga!");

                    }
                }
                catch(Exception exc)
                {
                    throw new Exception("Atenção! --> " + exc.Message);
                }
            }
        }

        /// <summary>
        /// Método responsável por limpar todos os campos da página.
        /// </summary>
        /// <param name="controlePai">Controle Pai</param>
        private void limparControles(Control controlePai)
        {
            this.cblBeneficio.ClearSelection();

            foreach (Control controleFilho in controlePai.Controls)
            {
                if (controleFilho.HasControls())
                {
                    this.limparControles(controleFilho);
                }
                else if (controleFilho is TextBox)
                {
                    if (!((TextBox)controleFilho).ID.Equals("txtRazaoSocial") && !((TextBox)controleFilho).ID.Equals("txtNomeFantasia"))
                        ((TextBox)controleFilho).Text = string.Empty;
                }
                else if (controleFilho is DropDownList)
                {
                    ((DropDownList)controleFilho).ClearSelection();
                }
            }
        }

        private void DesabilitarDivsErros()
        {
            this.divErroSalarioOferecido.Visible = false;
            this.divErroBeneficios.Visible = false;
            this.divErroPrimeiroExpediente.Visible = false;
            this.divErroSegundoExpediente.Visible = false;
            this.divErroCargaHorariaSemanal.Visible = false;
            this.divErroNumero.Visible = false;
            this.divErroCep.Visible = false;
            this.divErroUf.Visible = false;
            this.divErroTelefone.Visible = false;
        }

        private void Mensagem(string mensagem)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('"+mensagem+"');", true);
        }

    }

    public class CadastroDaVagaModelo
    {
        public string RazaoSocial { get; set; }
        public string NomeFantasia { get; set; }
        public string Ocupacao { get; set; }
        public string Funcao { get; set; }
        public Decimal SalarioOferecido { get; set; }
        public List<int> ListBeneficios { get; set; }
        public string PrimExpedienteEntrada { get; set; }
        public string PrimExpedienteSaida { get; set; }
        public string SegExpedienteEntrada { get; set; }
        public string SegmExpedienteSaida { get; set; }
        public int CargaHorariaSemanal { get; set; }
        public string ContatoEntrevista { get; set; }
        public string Endereco { get; set; }
        public int Numero { get; set; }
        public string Complemento { get; set; }
        public string BairroDistrito { get; set; }
        public string Cep { get; set; }
        public string Municipio { get; set; }
        public string Uf { get; set; }
        public string ReferenciaAcesso { get; set; }
        public string Telefone { get; set; }
        public string Email { get; set; }
        public string Observacao { get; set; }
    }

    public class Dao
    {
        #region Singleton
        private static Dao instance;

        private Dao() { }

        public static Dao Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Dao();
                }
                return instance;
            }
        }
        #endregion

        /// <summary>
        /// Responsável por retornar a string de conexão com o banco
        /// </summary>
        private string strConn
        {
            get { return @"Data Source=sql;Initial Catalog=Intranet;Persist Security Info=True;User ID=sa;Password=local;Connection Timeout=60"; }
        }

        #region Carregando os DropDownLists
        public DataTable CarregarBeneficio()
        {
            try
            {
                return SelectNaTabela("CamaraCVBeneficio");
            }
            catch { throw; }
        }
        
        public DataTable CarregarUf()
        {
            try
            {
                return SelectNaTabela("CEPsUF");
            }
            catch { throw; }
        }
        #endregion

        public bool CadastrarVaga(CadastroDaVagaModelo cadVaga)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                #region INSERT TABELA CamaraCVVaga
                SqlCommand comInsertVaga = new SqlCommand("INSERT INTO CamaraCVVaga (fkCnpjEmpresa, ocupacao, funcao, salario, dataAbertura, vagaAtiva) VALUES (@cnpj, @ocup, @func, @sal, @dt, 1);");

                DateTime dtAgora = DateTime.Now;

                comInsertVaga.Parameters.Add(new SqlParameter("cnpj", "03485324000155"));
                comInsertVaga.Parameters.Add(new SqlParameter("ocup", cadVaga.Ocupacao));
                comInsertVaga.Parameters.Add(new SqlParameter("func", cadVaga.Funcao));
                comInsertVaga.Parameters.Add(new SqlParameter("sal", cadVaga.SalarioOferecido));
                comInsertVaga.Parameters.Add(new SqlParameter("dt", dtAgora));

                executarQuery(comInsertVaga);
                #endregion

                #region SELECT TABELA CamaraCVVaga para capturar IdVaga
                SqlCommand comSelectIdVaga = new SqlCommand("SELECT pkIdVaga FROM CamaraCVVaga WHERE fkCnpjEmpresa = @cnpjSelect AND dataAbertura = @dtSelect");

                comSelectIdVaga.Parameters.Add(new SqlParameter("cnpjSelect", "03485324000155"));//Colocar buscando, não hard code----------------------------------------------------------------------
                comSelectIdVaga.Parameters.Add(new SqlParameter("dtSelect", dtAgora));

                DataTable dt = executarQuery(comSelectIdVaga);
                #endregion

                string idVaga;

                if (dt != null && dt.Rows.Count > 0)
                {
                    idVaga = dt.Rows[0][0].ToString();

                    #region INSERT TABELA CamaraCVEntrevista
                    SqlCommand comInsertEntrevista = new SqlCommand("INSERT INTO CamaraCVEntrevista (fkIdVaga, contato, endereco, numero, complemento, bairroDistrito, cep, municipio, uf, referenciaAcesso, telefone, email, observacoes) " +
                                                                    "VALUES (@idVaga, @contato, @endereco, @numero, @complemento, @bairroDistrito, @cep, @municipio, @uf, @referenciaAcesso, @telefone, @email, @observacoes);");

                    comInsertEntrevista.Parameters.Add(new SqlParameter("idVaga", idVaga));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("contato", cadVaga.ContatoEntrevista));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("endereco", cadVaga.Endereco));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("numero", cadVaga.Numero));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("complemento", cadVaga.Complemento));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("bairroDistrito", cadVaga.BairroDistrito));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("cep", cadVaga.Cep));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("municipio", cadVaga.Municipio));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("uf", cadVaga.Uf));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("referenciaAcesso", cadVaga.ReferenciaAcesso));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("telefone", cadVaga.Telefone));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("email", cadVaga.Email));
                    comInsertEntrevista.Parameters.Add(new SqlParameter("observacoes", cadVaga.Observacao));

                    executarQuery(comInsertEntrevista);
                    #endregion

                    #region INSERT TABELA CamaraCVHorarioTrabalho
                    SqlCommand comInsertHorarioTrabalho = new SqlCommand("INSERT INTO CamaraCVHorarioTrabalho (fkIdVaga, turnoUmHoraEntrada, turnoUmHoraSaida, turnoDoisHoraEntrada, turnoDoisHoraSaida, cargaHorariaSemanal) " + 
                                                                         "VALUES (@fkIdVaga, @turnoUmHoraEntrada, @turnoUmHoraSaida, @turnoDoisHoraEntrada, @turnoDoisHoraSaida, @cargaHorariaSemanal);");

                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("fkIdVaga", idVaga));
                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("turnoUmHoraEntrada", cadVaga.PrimExpedienteEntrada));
                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("turnoUmHoraSaida", cadVaga.PrimExpedienteSaida));
                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("turnoDoisHoraEntrada", cadVaga.SegExpedienteEntrada));
                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("turnoDoisHoraSaida", cadVaga.SegmExpedienteSaida));
                    comInsertHorarioTrabalho.Parameters.Add(new SqlParameter("cargaHorariaSemanal", cadVaga.CargaHorariaSemanal));

                    executarQuery(comInsertHorarioTrabalho);
                    #endregion

                    #region INSERT TABELA CamaraCVVaga_Beneficio

                    for (int i = 0; i < cadVaga.ListBeneficios.Count; i++)
                    {
                        SqlCommand comInsertVagaBeneficio = new SqlCommand("INSERT INTO CamaraCVVaga_Beneficio (fkIdVaga, fkIdBeneficio) VALUES (@fkIdVaga, @fkIdBeneficio);");

                        comInsertVagaBeneficio.Parameters.Add(new SqlParameter("fkIdVaga", idVaga));
                        comInsertVagaBeneficio.Parameters.Add(new SqlParameter("fkIdBeneficio", cadVaga.ListBeneficios[i].ToString()));

                        executarQuery(comInsertVagaBeneficio);
                    }
                    #endregion
                }

                scope.Complete();

                return true;
            }
            return false;
        }

        private DataTable SelectNaTabela(string nometabela)
        {
            try
            {
                SqlCommand command = new SqlCommand("SELECT * FROM " + nometabela + "");
                return executarQuery(command);
            }
            catch { throw; }
        }
        
        private DataTable executarQuery(SqlCommand command)
        {
            DataTable dt = new DataTable();
            SqlConnection conn = new SqlConnection(strConn);

            try
            {
                command.Connection = conn;
                SqlDataAdapter adapter = new SqlDataAdapter(command);
                adapter.Fill(dt);
            }
            catch { throw; }
            finally { conn.Close(); }

            return dt;
        }
    }
}